<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: yunwuxin <448901948@qq.com>
// +----------------------------------------------------------------------
declare (strict_types = 1); //声明代码的执行指令为开启严格模式,主要为参数类型为严格模式,方便常驻内存

namespace think\log;

use think\Log;

// +----------------------------------------------------------------------
// |
// | 干了什么活:渠道设置,通过继承的方式,把对象带到当前实例
// | 理解的层级:
// |
// | 道 :
// | 法 :
// | 术 :
// | 器 :
// |
// |
// |
// | 类模式 :
// | 原则：单一职责原则/里氏替换原则/依赖倒置原则/接口隔离原则/迪米特法则/开闭原则
// | 设计模式 : 适配器模式/桥梁模式/代理模式
// | 模式类型 : 结构类
// |
// | 知识点:
// +----------------------------------------------------------------------

/**
 * Class ChannelSet
 * @package think\log
 * @mixin Channel
 */
class ChannelSet
{
    protected $log;
    protected $channels;

    /**
     * 架构方法  实例化并传入参数,非常关键的一步,会把相关对象注入
     *
     * @access public
     * @param Log $log
     * @param array $channels //通道
     */
    public function __construct(Log $log, array $channels)
    {
        $this->log      = $log;
        $this->channels = $channels;
    }

    /**
     * 魔术方法
     * @access public
     * @param mixed $method
     * @param array $parameters
     * @return void
     */
    public function __call($method, $arguments)
    {
        foreach ($this->channels as $channel) {
            $this->log->channel($channel)->{$method}(...$arguments);
        }
    }
}
